<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
  <link href="https://gmpg.org/xfn/11" rel="profile">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="Hugo 0.68.3" />

  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>redis事物 &middot; 我的博客</title>
  <meta name="description" content="" />

  
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/print.css" media="print">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/poole.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/syntax.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/hyde.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700">


  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="/favicon.png">

  
  
</head>

  <body class="theme-base-09 ">
  <aside class="sidebar">
  <div class="container sidebar-sticky">
    <div class="sidebar-about">
      <a href="/my_technology_blog/"><h1>我的博客</h1></a>
      <p class="lead">
       这里是任永刚的个人博客 
      </p>
    </div>

    <nav>
      <ul class="sidebar-nav">
        <li><a href="/my_technology_blog/">Home</a> </li>
        
      </ul>
    </nav>

    <p>&copy; 2020. All rights reserved. </p>
  </div>
</aside>

    <main class="content container">
    <div class="post">
  <h1>redis事物</h1>
  <time datetime=2020-05-02T00:00:00Z class="post-date">Sat, May 2, 2020</time>
  <h2 id="1-redis事物介绍">1. redis事物介绍</h2>
<pre><code>1. redis事物是可以一次执行多个命令，本质是一组命令的集合。
2. 一个事务中的所有命令都会序列化，按顺序串行化的执行而不会被其他命令插入
作用：一个队列中，一次性、顺序性、排他性的执行一系列命令 
</code></pre>
<h2 id="2-redis事物基本使用">2. redis事物基本使用</h2>
<pre><code>1. 下面指令演示了一个完整的事物过程，所有指令在exec前不执行，而是缓存在服务器的一个事物队列中
2. 服务器一旦收到exec指令才开始执行事物队列，执行完毕后一次性返回所有结果
3. 因为redis是单线程的，所以不必担心自己在执行队列是被打断，可以保证这样的“原子性”
注：redis事物在遇到指令失败后，后面的指令会继续执行
</code></pre>
<h2 id="mysql的rollback与redis的discard的区别">mysql的rollback与redis的discard的区别:</h2>
<pre><code>　　　1) mysql回滚为sql全部成功才执行,一条sql失败则全部失败,执行rollback后所有语句造成的影响消失
　　　2) redis的discard只是结束本次事务,正确命令造成的影响仍然还在.

&gt; multi（开始一个redis事物）
incr books
incr books
&gt; exec （执行事物）
&gt; discard （丢弃事物）
3. watch指令
1. watch其实就是redis提供的一种乐观锁，可以解决并发修改问题
2. watch会在事物开始前盯住一个或多个关键变量，当服务器收到exec指令要顺序执行缓存中的事物队列时
3. redis会检查关键变量自watch后是否被修改（包括当前事物所在的客户端）
4. 如果关键变量被人改动过，exec指令就会返回null回复告知客户端事物执行失败，这个时候客户端会选择重试
注：redis禁用在multi和exec之间执行watch指令，必须在multi之前盯住关键变量，否则会出错</code></pre>

</div>


    </main>

    
      
    
  </body>
</html>
